#include <iostream>
#include <vector>

struct Vertex
{
    int x, y, z;


    Vertex(int x,int y,int z) :x(x),y(y),z(z){}

    Vertex(const Vertex& v) : x(v.x),y(v.y),z(v.z)
    {
        std::cout << "Copied" <<std::endl;
    }
};

std::ostream &operator<<(std::ostream &stream, Vertex vertex)
{
    stream << vertex.x << ", " << vertex.y << ", " << vertex.z;
    return stream;
}

void Function(std::vector<Vertex> &vertex)
{
    // Vector push_back方法等同于arraylist 的add方法

    vertex.push_back({1, 2, 3});
    vertex.push_back({4, 5, 6});
    vertex.push_back({7, 8, 9});
}

int main()
{
    std::vector<Vertex> vertices;

    /*
    for (int i=0;i<vertices.size();i++)
        std::cout << vertices[i] << std::endl;
    */
    // erase 方法接受literator 类型参数，表示删除指定Vector元素
    // begin 方法返回从第一个元素开始的literator 类型, +1 表示前进一次
    vertices.erase(vertices.begin() + 1);

    // 重置Vector 中的所有元素;
    vertices.clear();

    // Vectot 的优化策略

    // Vector::reserve 方法为Vector 预先设置最小对象数量，减少Vector后续扩容时可能会产生的复制次数
    vertices.reserve(3);

    // Vector::emplace_back() 方法传入参数列表构造Vector对象，可以减少一次构建对象的过程开销，push_back方法传入构建好的对象
    vertices.emplace_back(1, 2, 3);
    Function(vertices);
    
    std::cout << vertices.capacity() << std::endl;
}